package mutacion;

import java.util.ArrayList;

import utils.SRandom;
import gen.GenP2;
import cromosoma.Cromosoma;

public class MutacionInsercion implements IMutacion {

	@Override
	public void mutacion(Cromosoma c, double probMutacion) {
		
		boolean mutado;
		
		//ponemos un numero de ciudades que van a mutar.
	    final int CIUDADESMUTADAS = 2;
		//Sacamos los genes del cromosoma.
		
		GenP2[] genes = (GenP2[]) c.get_genes();
		
		//Una vez que tengo los genes recorro la probabilidad de mutacion.
		
			mutado = false;
			double rand = SRandom.nextDouble();
			
			if (rand < probMutacion)
			{
				//posiciones=array de las posicion de la ciudad a reemplazar.
				ArrayList<Integer> posiciones = new ArrayList<Integer>();
				//posCiudad= array de la posicion a mover a la cuidad de posiciones.
				ArrayList<Integer> posCiudad = new ArrayList<Integer>();
			
			
				for (int j = 0; j < CIUDADESMUTADAS; j++)
				{
					posiciones.add(SRandom.nextInt(c.get_longitudCromosoma() - 1));
					posCiudad.add(SRandom.nextInt(c.get_longitudCromosoma() - 1));
				}
			
				/*
				posiciones.add(1);
				posiciones.add(5);
				posCiudad.add(3);
				posCiudad.add(7);
				*/
				
				//Intercambiamos las ciudades y corremos el resto.
				int ciudadReemplazada;
				int r;
				
				int cromoAux;
				for (int k = 0; k < posiciones.size(); k++)
				{
					ciudadReemplazada = (Integer) genes[posiciones.get(k)].getGen();
					
					genes[posiciones.get(k)] = (GenP2) genes[posCiudad.get(k)].clone();
					
					r = posiciones.get(k) + 1;
					
					//rellenamos el cromosoma.
					while (!((Integer) genes[r].getGen())
							.equals((Integer) genes[posCiudad.get(k)]
									.getGen()))
					{
						cromoAux = ciudadReemplazada;
						ciudadReemplazada = (Integer) genes[r].getGen();
						genes[r].setGen(cromoAux);
						r = (r + 1) % genes.length;
					}
					genes[r].setGen(ciudadReemplazada);	
				}
				
				mutado = true;
			}
			
			//Si ha mutado entonces volvemos a evaluar el cromosoma.
			if (mutado) c.evalua();	
		}	
	
	

}
